package com.zzwtec.validation.core;

import java.util.Map;

import com.zzwtec.validation.AnnotationValidator;
import com.zzwtec.validation.ValidateResult;

/**
 * 核心类
 * 
 * @author  草原狼
 *
 * 2017年8月22日
 */

public class GroupValidator {
	
	Configuration conf = null;
	ValidatorEngine engine = null;
	
	public GroupValidator(Configuration conf) {
		try{
			this.conf = conf;
			init();			
		}
		catch (Exception ex){
			throw new RuntimeException("初始化失败", ex);
		}
	}
	
	/**
	 * 初始化验证组
	 */
	protected void init() {
		engine = ValidatorEngineFactory.getEngine(conf.getEngine());
		Map<String, Object> validConfg = conf.validatorMap;
		if(validConfg != null) {
			//从配置中注册验证器到引擎
			for(Map.Entry<String, Object> entry : validConfg.entrySet()) {
				String name = entry.getKey();
				AnnotationValidator valid = (AnnotationValidator)entry.getValue();
				valid.setName(name);
				engine.register(name,valid);
			}
		}		
	}
	
	/**
	 * 暴露验证器集合
	 * @return
	 */
	public Map<String,AnnotationValidator> getValidMaps(){
		return engine.copyValidMaps();
	}

	/**
	 * 遍历所有字段，用所有解析器进行校验，如果校验失败，则终止校验返回结果，如果校验成功，同样返回校验结果
	 * 支持忽略校验器，解决DTO被多接口共用的情况 
	 * @param t
	 * @param rule
	 * @return
	 */
	public <T> ValidateResult validate(T t, RuntimeValidateRule<T> rule) {		
		return engine.validate(t, rule);
	}
	
	/**
	 * 遍历所有字段，用所有解析器进行校验，如果校验失败，则终止校验返回结果，如果校验成功，同样返回校验结果
	 * @param t
	 * @return
	 */
	public <T> ValidateResult validate(T t) {
		return engine.validate(t);
	}
	
}
